import TencentCloudChat, { Profile } from '@tencentcloud/chat'
import { useTencentChat } from '@/stores/tencentChat.ts'

export const useTencentUserStore = defineStore(
  'TencentUser',
  () => {
    const tencentChat = useTencentChat()
    const myProfile = ref<Partial<Profile>>({})
    const friendList = ref()
    const friendGroupList = ref()
    const blacklist = ref<string[]>([])
    const userStatusMap = reactive<Record<string, { userID: string; statusType: number; customStatus: string }>>({})
    const userProfileMap = reactive<Record<string, Partial<Profile>>>({})

    const getMyProfile = () => {
      // console.log('get my profile', tencentChat.chat?.isReady())
      tencentChat.chat?.getMyProfile()
        .then((res) => {
          myProfile.value = res.data
          // console.log(`初始化当前用户资料 ${JSON.stringify(myProfile.value)}`)

          // 获取黑名单
          getBlacklist()
        })
        .catch((error) => {
          console.log('getMyProfile error:', error)
        })
    }

    const getUserProfile = async (options: { userIDList: string[] }) => {
      await tencentChat.chat?.getUserProfile(options)
        .then((res) => {
          res.data.forEach((item: Profile) => {
            userProfileMap[item.userID] = item
            console.log('user profile map', userProfileMap[item.userID])
          })
        })
        .catch((error) => {
          console.log('getUserProfile error:', error)
        })
    }

    const getUserProfileMap = async (userID: string) => {
      if (userProfileMap[userID] === undefined) {
        await getUserProfile({ userIDList: [userID] })
      }

      return userProfileMap[userID]
    }

    /**
     * 设置自己的状态
     * @param options
     */
    const setSelfStatus = (options: any) => {
      tencentChat.chat?.setSelfStatus({ customStatus: options?.customStatus || '' }).then((res) => {
        console.log('set self status', res)
        // const { userID, statusType, customStatus } = res.data;
        // userID - 用户 ID
        // statusType - 用户状态，枚举值及说明如下：
        // TencentCloudChat.TYPES.USER_STATUS_UNKNOWN - 未知
        // TencentCloudChat.TYPES.USER_STATUS_ONLINE - 在线
        // TencentCloudChat.TYPES.USER_STATUS_OFFLINE - 离线
        // TencentCloudChat.TYPES.USER_STATUS_UNLOGINED - 未登录
        // customStatus - 用户自定义状态
      })
    }

    /**
     * 查询用户状态
     * @param options
     */
    const getUserStatus = async (options: { userIDList: string[] }) => {
      await tencentChat.chat?.getUserStatus(options)
        .then((res) => {
          const { successUserList } = res.data
          successUserList.forEach((item: any) => {
            // const { userID, statusType, customStatus } = item
            userStatusMap[item.userID] = item
            // userID - 用户 ID
            // statusType - 用户状态，枚举值及说明如下：
            // TencentCloudChat.TYPES.USER_STATUS_UNKNOWN - 未知 0
            // TencentCloudChat.TYPES.USER_STATUS_ONLINE - 在线 1
            // TencentCloudChat.TYPES.USER_STATUS_OFFLINE - 离线 2
            // TencentCloudChat.TYPES.USER_STATUS_UNLOGINED - 未登录 3
            // customStatus - 用户自定义状态
          })
        })
        .catch((error) => {
          console.warn('getUserStatus error:', error)
        })
    }

    const updateMyProfile = (options: any) => {
      tencentChat.chat?.updateMyProfile(options)
        .then((res) => {
          console.log(res.data)
          getMyProfile()
        })
        .catch(function (imError) {
          console.warn('updateMyProfile error:', imError) // 更新资料失败的相关信息
        })
    }

    const subscribeUserStatus = (options: { userIDList: string[] }) => {
      tencentChat.chat?.subscribeUserStatus(options)
        .then(function (imResponse) {
          console.log('subscribe user status', imResponse)
          // const { failureUserList } = imResponse.data;
          // // 订阅失败的用户列表
          // failureUserList.forEach((item) => {
          //   const { userID, code, message } = item;
          //   // userID - 查询失败的用户 ID
          //   // code - 查询失败的错误码
          //   // message - 查询失败的错误信息
          // });
        })
        .catch(function (imError) {
          console.warn('subscribeUserStatus error:', imError) // 订阅用户状态失败的相关信息
        })
    }

    const unsubscribeUserStatus = (options: { userIDList: string[] }) => {
      tencentChat.chat?.unsubscribeUserStatus(options)
        .then(function (imResponse) {
          console.log('unsubscribe user status', imResponse)
          // const { failureUserList } = imResponse.data;
          // // 取消订阅失败的用户列表
          // failureUserList.forEach((item) => {
          //   const { userID, code, message } = item;
          //   // userID - 查询失败的用户 ID
          //   // code - 查询失败的错误码
          //   // message - 查询失败的错误信息
          // });
        })
        .catch(function (imError) {
          console.warn('unsubscribeUserStatus error:', imError) // 取消订阅失败的相关信息
        })
    }

    const getFriendList = () => {
      tencentChat.chat?.getFriendList()
        .then(function (imResponse) {
          friendList.value = imResponse.data // 好友列表
        })
        .catch(function (imError) {
          console.warn('getFriendList error:', imError) // 获取好友列表失败的相关信息
        })
    }

    const addFriend = (options: any) => {
      options = {
        to: 'user1',
        source: 'AddSource_Type_Web',
        remark: '小橙子',
        groupName: '好友',
        wording: '我是 user0',
        type: TencentCloudChat.TYPES.SNS_ADD_TYPE_BOTH
      }
      // 添加好友
      tencentChat.chat?.addFriend(options)
        .then(function (imResponse) {
          // 添加好友的请求发送成功
          const { code } = imResponse.data
          if (code === 30539) {
            // 30539 说明 user1 设置了【需要经过自己确认对方才能添加自己为好友】
            // 此时 SDK 会触发 TencentCloudChat.EVENT.FRIEND_APPLICATION_LIST_UPDATED 事件
          } else if (code === 0) {
            // 0 说明 user1 设置了【允许任何人添加自己为好友】
            // 此时 SDK 会触发 TencentCloudChat.EVENT.FRIEND_LIST_UPDATED 事件
          }
        })
        .catch(function (imError) {
          console.warn('addFriend error:', imError) // 添加好友失败的相关信息
        })
    }

    const deleteFriend = (options: any) => {
      tencentChat.chat?.deleteFriend(options)
        .then(function (imResponse) {
          console.log('delete friend', imResponse)
          // const { successUserIDList, failureUserIDList } = imResponse.data;
          // // 删除成功的 userIDList
          // successUserIDList.forEach((item) => {
          //   const { userID } = item;
          // });
          // // 删除失败的 userIDList
          // failureUserIDList.forEach((item) => {
          //   const { userID, code, message } = item;
          // });
          // 如果好友列表有变化，则 SDK 会触发 TencentCloudChat.EVENT.FRIEND_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('removeFromFriendList error:', imError)
        })
    }

    const checkFriend = (options: any) => {
      options = {
        userIDList: ['user0', 'user1'],
        type: TencentCloudChat.TYPES.SNS_CHECK_TYPE_BOTH
      }
      tencentChat.chat?.checkFriend(options)
        .then(function (imResponse) {
          console.log('check friend', imResponse)
          // const { successUserIDList, failureUserIDList } = imResponse.data;
          // // 校验成功的 userIDList
          // successUserIDList.forEach((item) => {
          //   const { userID, code, relation } = item; // 此时 code 始终为0
          //   // 单向校验好友关系时可能的结果有：
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_NO_RELATION A 的好友表中没有 B，
          //   // 但无法确定 B 的好友表中是否有 A
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_A_WITH_B A 的好友表中有 B，但无法确定 B 的好友表中是否有 A
          //   // 双向校验好友关系时可能的结果有：
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_NO_RELATION A 的好友表中没有 B，B 的好友表中也没有 A
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_A_WITH_B A 的好友表中有 B，但 B 的好友表中没有 A
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_B_WITH_A A 的好友表中没有 B，但 B 的好友表中有 A
          //   // - relation: TencentCloudChat.TYPES.SNS_TYPE_BOTH_WAY A 的好友表中有 B，B 的好友表中也有 A
          // });
          // // 校验失败的 userIDList
          // failureUserIDList.forEach((item) => {
          //   const { userID, code, message } = item;
          // });
        })
        .catch(function (imError) {
          console.warn('checkFriend error:', imError)
        })
    }

    const createFriendGroup = (options: any) => {
      options = {
        name: '我的好友分组1',
        userIDList: ['user0', 'user1']
      }
      tencentChat.chat?.createFriendGroup(options)
        .then(function (imResponse) {
          console.log('create friend group', imResponse)
          // const { friendGroup, failureUserIDList } = imResponse;
          // friendGroup - 好友分组实例
          // failureUserIDList - 失败的 userID 列表
          // 创建成功后，SDK 会触发 TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('getFriendGroupInfo error:', imError) // 获取失败
        })
    }

    const deleteFriendGroup = (options: { name: string }) => {
      tencentChat.chat?.deleteFriendGroup(options)
        .then(function (imResponse) {
          console.log('delete friend group', imResponse.data) // 被删除的分组实例
          // 删除成功后，SDK 会触发 TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('deleteFriendGroup error:', imError) // 获取失败
        })
    }

    const renameFriendGroup = (options: { oldName: string; newName: string }) => {
      options = {
        oldName: '好友',
        newName: '闺蜜'
      }
      tencentChat.chat?.renameFriendGroup(options)
        .then(function (imResponse) {
          console.log(imResponse.data) // FriendGroup 实例
          // 修改成功后，SDK 会触发 TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('updateMyProfile error:', imError)
        })
    }

    const getFriendGroupList = () => {
      tencentChat.chat?.getFriendGroupList()
        .then(function (imResponse) {
          friendGroupList.value = imResponse.data // 好友分组列表
        })
        .catch(function (imError) {
          console.warn('getFriendGroupList error:', imError) // 获取好友分组列表失败的相关信息
        })
    }

    const addToFriendGroup = (options: { name: string; userIDList: string[] }) => {
      options = {
        name: '我的好友分组1',
        userIDList: ['user1', 'user2']
      }
      tencentChat.chat?.addToFriendGroup(options)
        .then(function (imResponse) {
          console.log('add to friend group', imResponse)
          // const { friendGroup, failureUserIDList } = imResponse.data;
          // friendGroup - 好友分组实例
          // failureUserIDList - 失败的 userID 列表
          // 添加成功后，SDK 会触发 TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('addToFriendGroup error:', imError) // 获取失败
        })
    }

    const removeFromFriendGroup = (options: { name: string; userIDList: string[] }) => {
      options = {
        name: '我的好友分组1',
        userIDList: ['user1', 'user2']
      }
      tencentChat.chat?.removeFromFriendGroup(options)
        .then(function (imResponse) {
          console.log('remove from friend group', imResponse)
          // const { friendGroup, failureUserIDList } = imResponse.data;
          // friendGroup - 好友分组实例
          // failureUserIDList - 失败的 userID 列表
          // 移除成功后，SDK 会触发 TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED 事件
        })
        .catch(function (imError) {
          console.warn('addToFriendGroup error:', imError) // 获取失败
        })
    }

    const addToBlacklist = (options: { userIDList: string[] }) => {
      // 请注意：即使只添加一个用户账号到黑名单，也需要用数组类型，例如：userIDList: ['user1']
      tencentChat.chat?.addToBlacklist(options)
        .then(function (imResponse) {
          console.log('add to black list', imResponse.data) // 成功添加到黑名单的账号信息，结构为包含用户 userID 的数组 - [userID]
        })
        .catch(function (imError) {
          console.warn('addToBlacklist error:', imError) // 添加用户到黑名单列表失败的相关信息
        })
    }

    const removeFromBlacklist = (options: { userIDList: string[] }) => {
      // 请注意：即使只从黑名单中移除一个用户账号，也需要用数组类型，例如：userIDList: ['user1']
      tencentChat.chat?.removeFromBlacklist(options)
        .then(function (imResponse) {
          console.log('remove from black list', imResponse.data) // 从黑名单中成功移除的账号列表，结构为包含用户 userID 的数组 - [userID]
        })
        .catch(function (imError) {
          console.warn('removeFromBlacklist error:', imError) // 将用户从黑名单中移除失败的相关信息
        })
    }

    const getBlacklist = () => {
      tencentChat.chat?.getBlacklist()
        .then(function (imResponse) {
          // console.log('get black list', imResponse.data); // 我的黑名单列表，结构为包含用户 userID 的数组 - [userID]
          blacklist.value = imResponse.data
        })
        .catch(function (imError) {
          console.warn('getBlacklist error:', imError) // 获取黑名单列表失败的相关信息
        })
    }

    return {
      getUserProfile,
      getUserStatus,
      updateMyProfile,
      myProfile,
      getMyProfile,
      setSelfStatus,
      subscribeUserStatus,
      unsubscribeUserStatus,
      friendList,
      getFriendList,
      addFriend,
      deleteFriend,
      checkFriend,
      createFriendGroup,
      deleteFriendGroup,
      renameFriendGroup,
      getFriendGroupList,
      friendGroupList,
      addToFriendGroup,
      removeFromFriendGroup,
      addToBlacklist,
      removeFromBlacklist,
      getBlacklist,
      blacklist,
      userProfileMap,
      userStatusMap,
      getUserProfileMap
    }
  },
  {
    share: {
      enable: true,
      initialize: true
    }
  }
)
